#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
日志模块

这个模块提供了统一的日志记录功能。
"""

import os
import logging
from logging.handlers import RotatingFileHandler

# 默认配置
TEMP_DIR = 'temp'
LOG_DIR = os.path.join(TEMP_DIR, 'logs')
DEFAULT_LOG_CONFIG = {
    'level': 'INFO',
    'file': os.path.join(LOG_DIR, 'app.log'),
    'max_size': 10485760,  # 10MB
    'backup_count': 5
}

# 全局 app_logger 变量
app_logger = None

def setup_logger(config=None, port=None):
    """设置日志记录器

    Args:
        config: 日志配置字典，可选
        port: 端口号，用于区分不同端口的日志
    """
    global app_logger

    # 使用提供的配置或默认配置
    log_config = config or DEFAULT_LOG_CONFIG
    log_level = getattr(logging, log_config.get('level', 'INFO'))
    log_file = log_config.get('file', 'logs/app.log')
    max_size = log_config.get('max_size', 10 * 1024 * 1024)  # 默认10MB
    backup_count = log_config.get('backup_count', 5)

    # 确保日志目录存在
    os.makedirs(LOG_DIR, exist_ok=True)
    os.makedirs(os.path.dirname(log_file), exist_ok=True)

    # 创建日志记录器
    logger = logging.getLogger('app')
    logger.setLevel(log_level)

    # 清除现有的处理器
    logger.handlers.clear()

    # 创建文件处理器
    file_handler = RotatingFileHandler(
        log_file,
        maxBytes=max_size,
        backupCount=backup_count,
        encoding='utf-8'
    )

    # 创建自定义的UI日志处理器
    class UIHandler(logging.Handler):
        def __init__(self, port):
            super().__init__()
            self.port = port

        def emit(self, record):
            # 这里将日志发送到对应端口的UI界面
            # 实际实现需要与UI模块集成
            pass

    # 自定义安全Formatter，避免port缺失时报错
    class SafeFormatter(logging.Formatter):
        def format(self, record):
            if not hasattr(record, "port"):
                record.port = ""
            return super().format(record)

    formatter = SafeFormatter(
        '%(asctime)s - %(name)s - %(levelname)s - [线程:%(thread)d][端口:%(port)s] - %(message)s'
    )
    file_handler.setFormatter(formatter)

    # 添加处理器
    logger.addHandler(file_handler)

    # 为每个端口创建单独的UI处理器
    if port:
        ui_handler = UIHandler(port)
        ui_handler.setFormatter(formatter)
        logger.addHandler(ui_handler)

    # 设置全局 app_logger
    app_logger = logger

    return logger

def get_logger(name, port=None):
    """获取指定名称的日志记录器

    Args:
        name: 日志记录器名称
        port: 端口号，用于区分不同端口的日志

    Returns:
        logging.Logger: 日志记录器实例
    """
    logger = logging.getLogger(name)
    if not logger.handlers:
        # 如果日志记录器没有处理器，使用全局配置
        # 确保 app_logger 已被初始化
        if app_logger is None:
            setup_logger()

        logger.setLevel(app_logger.level)
        for handler in app_logger.handlers:
            logger.addHandler(handler)
        logger.propagate = False  # 避免重复日志

    # 添加端口到日志记录
    if port:
        old_factory = logging.getLogRecordFactory()

        def record_factory(*args, **kwargs):
            record = old_factory(*args, **kwargs)
            record.port = port
            return record

        logging.setLogRecordFactory(record_factory)

    return logger

# 初始化默认日志记录器
if app_logger is None:
    setup_logger()

# 测试代码
if __name__ == "__main__":
    app_logger.debug("这是一条调试日志")
    app_logger.info("这是一条信息日志")
    app_logger.warning("这是一条警告日志")
    app_logger.error("这是一条错误日志")
    app_logger.critical("这是一条严重错误日志")
    
    print(f"日志文件保存在: {os.path.abspath(os.path.dirname(app_logger.handlers[0].baseFilename))}")
